Jerry's Log

Design Patterns

contents

디자인 패턴은 소프트웨어 설계에서 흔히 발생하는 문제에 대한 일반적이고 재사용 가능한 해결책입니다. 이는 완성된 코드가 아니라, 특정 문제를 해결하기 위해 따를 수 있는 템플릿 또는 "청사진" 과 같습니다.

이렇게 생각해 보세요. 디자인 패턴은 주방의 청사진과 같습니다. 벽을 무슨 색으로 칠할지 알려주지는 않지만, 싱크대, 오븐, 냉장고를 효율적이고 기능적으로 배치하는 검증된 레이아웃을 설명합니다.

이 패턴들은 "GoF(Gang of Four)" 라고 알려진 에릭 감마, 리처드 헬름, 랄프 존슨, 존 블리시디스가 쓴 1994년 책 Design Patterns: Elements of Reusable Object-Oriented Software 를 통해 유명해졌습니다.

디자인 패턴을 사용하는 이유

디자인 패턴을 사용하면 다음과 같은 주요 이점이 있습니다.


디자인 패턴의 세 가지 범주

23개의 고전적인 GoF 패턴은 목적에 따라 세 가지 주요 범주로 나뉩니다.

  1. 생성 패턴 (Creational Patterns): 객체 생성 메커니즘을 다룹니다.
  2. 구조 패턴 (Structural Patterns): 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명합니다.
  3. 행동 패턴 (Behavioral Patterns): 알고리즘과 객체 간의 책임 할당에 관련됩니다.

1. 🎨 생성 패턴

이 패턴들은 기존 코드의 유연성과 재사용성을 높이는 객체 생성 메커니즘을 제공합니다. 시스템이 객체를 생성하고, 구성하고, 표현하는 방식에 독립적이 되도록 돕습니다.

예제 1: 싱글톤 패턴 (Singleton Pattern)

예제 2: 팩토리 메서드 패턴 (Factory Method Pattern)


2. 🏗️ 구조 패턴

이 패턴들은 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명합니다.

예제 1: 어댑터 패턴 (Adapter Pattern)

예제 2: 데코레이터 패턴 (Decorator Pattern)


3. 🏃‍♂️ 행동 패턴

이 패턴들은 객체 간의 커뮤니케이션에 관한 것입니다. 공통적인 커뮤니케이션 패턴을 식별하고 이를 더 유연하고 신뢰할 수 있게 만듭니다.

예제 1: 스트래티지 패턴 (Strategy Pattern)

예제 2: 옵저버 패턴 (Observer Pattern)


마지막 경고: "망치와 못" 문제

디자인 패턴은 강력하지만 마법의 총알은 아닙니다. 신입 개발자가 저지르는 흔한 실수는 패턴을 하나 배운 뒤, 자신이 마주하는 모든 문제에 그 패턴을 강제로 적용하려는 것입니다. "손에 망치를 들면 모든 것이 못으로 보인다"는 문제입니다.

항상 가능한 가장 단순한 해결책으로 시작하세요. 디자인 패턴은 오직 그 패턴이 해결하도록 설계된, 특정하고 반복적인 문제가 발생했을 때만 도입해야 합니다.


생성 패턴은 객체 생성 메커니즘을 다루는 소프트웨어 디자인 패턴의 한 범주입니다. 이 패턴의 주된 목표는 시스템이 객체를 생성하고, 구성하며, 표현하는 방식에 독립적이면서 더 유연해지도록 만드는 것입니다.

new 키워드로 특정 클래스를 하드코딩하는 대신, 이 패턴들은 애플리케이션이 필요로 하는 객체를 "제조"하기 위한 더 제어되고 분리된 방법을 제공합니다.

생성 패턴이 해결하는 핵심 문제

직접적인 객체 생성(new MyClass())의 주된 문제는 유연성 부족입니다. 이는 코드를 특정 구상(concrete) 클래스에 강하게 결합시킵니다. 나중에 클래스를 변경(예: MyBetterClass 사용)하고 싶다면, new MyClass()가 사용된 모든 곳을 찾아서 변경해야 합니다.

생성 패턴은 생성 과정을 추상화하여 이 문제를 해결합니다. 코드는 더 이상 "나는 new Truck()이 필요해"라고 말하는 대신, "나는 Vehicle이 필요해"라고 말하고, 패턴이 어떤 특정 Vehicle 타입을 제공할지 결정합니다.


5가지 "GoF" 생성 패턴

가장 유명한 생성 패턴은 "Gang of Four"(GoF)에 의해 설명된 5가지입니다.

1. 팩토리 메서드 패턴 (Factory Method Pattern)


2. 추상 팩토리 패턴 (Abstract Factory Pattern)


3. 빌더 패턴 (Builder Pattern)


4. 싱글톤 패턴 (Singleton Pattern)


5. 프로토타입 패턴 (Prototype Pattern)


구조 패턴은 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명하며, 이 구조를 유연하고 효율적으로 유지합니다. 이 패턴들은 엔티티 간의 관계를 단순화하여 이들이 함께 작동하기 쉽도록 하는 데 중점을 둡니다.

주요 목표는 의존성을 관리하고 객체를 구성하여, 시스템을 사용하는 부분을 망가뜨리지 않고도 구조를 변경할 수 있도록 하는 것입니다.


1. 어댑터 패턴 (Adapter Pattern) 🔌

어댑터 패턴은 번역기처럼 작동하여, 호환되지 않는 두 인터페이스가 함께 작동할 수 있도록 합니다.


2. 데코레이터 패턴 (Decorator Pattern)

데코레이터 패턴은 객체를 특별한 "래퍼(wrapper)" 객체로 감싸서 동적으로 새로운 행동을 첨부할 수 있게 합니다.


3. 퍼사드 패턴 (Facade Pattern) 🏛️

퍼사드 패턴은 (서브시스템이나 라이브러리처럼) 크고 복잡한 코드 덩어리에 대해 단순화된, 상위 수준의 인터페이스를 제공합니다.


4. 컴포지트 패턴 (Composite Pattern) 🌳

컴포지트 패턴은 객체들을 트리 같은 구조로 조합하고, 이 구조들을 마치 개별 객체인 것처럼 다룰 수 있게 합니다.


5. 프록시 패턴 (Proxy Pattern)

프록시 패턴은 다른 객체에 대한 접근을 제어하기 위해 해당 객체를 대신하는 대리자나 플레이스홀더를 제공합니다.


행동 패턴은 알고리즘과 객체 간의 책임 할당에 중점을 둔 디자인 패턴의 한 범주입니다. 이 패턴들은 서로 다른 객체와 클래스가 작업을 완수하기 위해 어떻게 소통하고 협력하는지 설명합니다.

행동 패턴의 주된 목표는 커뮤니케이션의 유연성을 높이고 객체 간의 상호작용을 더 느슨하게 결합하는 것입니다.


1. 🎯 스트래티지 패턴 (Strategy Pattern)


2. 📡 옵저버 패턴 (Observer Pattern)


3. 🏷️ 커맨드 패턴 (Command Pattern)


4. 📝 템플릿 메서드 패턴 (Template Method Pattern)


5. 🚶‍♂️ 이터레이터 패턴 (Iterator Pattern)


6. vending-machine 스테이트 패턴 (State Pattern)


기타 주요 행동 패턴

references